<?php

/**
 * @author kingop
 */
class AccountController extends CustomControllerAction {

    public function indexAction() {
        $this->view->page_title = "Пользователь";
        $auth = Zend_Auth::getInstance();
      
        $user = new DatabaseObject_User($this->db);
        $user->load($auth->getIdentity()->id);
        $this->view->user= $user;
        $this->view->usermenu= 'index';
    }

    public function registerAction() {
        $request = $this->getRequest();
        $fp = new FormProcessor_UserRegistration($this->db);

        $cats = DatabaseObject_Categories::GetCategories($this->db);
        $validate = $request->isXmlHttpRequest();
      
        if ($request->isPost()) {
            if ($validate) {
                $fp->validateOnly(true);
                $fp->process($request);
            } else if ($fp->process($request)) {
                $session = new Zend_Session_Namespace('registration');
                $session->user_id = $fp->user->getId();
                $this->_redirect($this->getUrl('registercomplete'));
            }
        }

        if ($validate) {
            $json = array(
                'errors' => $fp->getErrors()
            );
            $this->sendJson($json);
        } else {
            $this->view->fp = $fp;
        }
        if ($this->getRequest()->getParam('region')) { $region_id = $this->getRequest()->getParam('region');$this->view->cities = DatabaseObject_Cities::GetCities($this->db, $region_id);}
        $this->view->regions = DatabaseObject_Region::GetRegion($this->db);
        $this->view->cats = $cats;
        $this->view->fp = $fp;
    }

    public function registercompleteAction() {
        $session = new Zend_Session_Namespace('registration');

        // загрузим данные о пользователе по его ID
        $user = new DatabaseObject_User($this->db);
        if (!$user->load($session->user_id)) {
            $this->_forward('register');
            return;
        }

        // отправим email-ы админам, чтобы сообщить им о новой регистрации
        $emails = $this->configuration['admin_email'];
        $subject = $this->configuration['admin_reg_subject'];

        $link_to_view_user = '<a href="http://' . $_SERVER['SERVER_NAME'] . '/admin/users/edit/' . $user->getId() . '">Просмотреть пользователя</a>';
        $text = preg_replace('/%userlink%/', $link_to_view_user, $this->configuration['admin_reg_text']);

        /* Для отправки HTML-почты вы можете установить шапку Content-type. */
        $headers= "MIME-Version: 1.0\r\n";
        $headers .= "Content-type: text/html; charset=utf-8\r\n";

        /* дополнительные шапки */
        $headers .= "From: Герц. Тендерная площадка <administrator@tenders.gerc.dn.ua>\r\n";
        
        
        mail($emails, $subject, $text, $headers);
        
        $message = sprintf('Зарегистрирован пользователь  %s',
                               $user->login);

        $this->writeLog($message);

        // отправим пользователю письмо с уведомлением об успешной регистрации
        $subject = preg_replace("/%username%/", $user->login, $this->configuration['email_reg_subject']);
        $text = preg_replace('/%username%/', $user->login, $this->configuration['email_reg_text']);

        mail($user->email, $subject, $text, $headers);

        $this->view->user = $user;
    }

    public function loginAction() {
        // если пользователь уже залогинен, отправим его на главную страницу
        $auth = Zend_Auth::getInstance();

        if ($auth->hasIdentity())
            $this->_redirect($this->getUrl('index', 'index'));

        $request = $this->getRequest();

        // определим страницу с которой пользователь пришёл
        $redirect = $request->getPost('redirect');
        if (strlen($redirect) == 0)
            $redirect = $request->getServer('REQUEST_URI');
        if (strlen($redirect) == 0)
            $redirect = $this->getUrl();

        // инициализируем массиа для хранения ошибок
        $errors = array();

        // если была отправлена форма, попробуем залогиниться
        if ($request->isPost()) {

            // проверим данные из формы и проверим их
            $login = $request->getPost('login');
            $password = $request->getPost('password');

            if (strlen($login) == 0)
                $errors['login'] = 'Поле "Логин" должно быть заполнено';
            if (strlen($password) == 0)
                $errors['password'] = 'Поле "Пароль" должно быть заполнено';

            if(!DatabaseObject_User::IsApproved($this->db, $login))
                $errors['login'] = 'Ваша учетная запись еще не прошла модерацию. Как только наши модераторы проверят вашу информацию, вы сможете выполнить вход под своей учетной записью. Об этом вам будет сообщено по email.';
            
            if (count($errors) == 0) {

                // подключим адаптер авторизации
                $adapter = new Zend_Auth_Adapter_DbTable($this->db, 'users', 'login', 'password', 'md5(?)');

                $adapter->setIdentity($login);
                $adapter->setCredential($password);

                // попытаемся идентифицировать пользователя
                $result = $auth->authenticate($adapter);

                if ($result->isValid()) {
                    $user = new DatabaseObject_User($this->db);
                    $user->load($adapter->getResultRowObject()->id);

                    /*if ($user->isApproved == 0) {
                        $errors['login'] = 'Ваша учетная запись еще не прошла модерацию. Как только наши модераторы проверят вашу информацию, вы сможете выполнить вход под своей учетной записью. Об этом вам будет сообщено по email.';
                    } else {*/
                        // создадим сессионные данные и запишем их в сессию
                        $identity = $user->createAuthIdentity();
                        $auth->getStorage()->write($identity);

                        $message = sprintf('Успешная авторизация пользователя  %s',
                               $user->login);

                        $this->writeLog($message);
                        
                        // вернем пользователяна исходную страницу
                        $this->_redirect($redirect);
                    //}
                } else {
                    $errors['login'] = 'Неверная пара логин/пароль';
                    
                    $message = sprintf('Неуспешная попытка авторизации пользователя  %s',
                               $login);

                    $this->writeLog($message);
                }
            }
        }

        $this->view->errors = $errors;
        $this->view->redirect = $redirect;
    }

    public function logoutAction() {
        Zend_Auth::getInstance()->clearIdentity();
        $this->_redirect($this->getUrl('login'));
    }

    public function fetchpasswordAction() {
        // если пользователь уже вошел, перенаправим его на главную страницу
        if (Zend_Auth::getInstance()->hasIdentity())
            $this->_redirect($this->getUrl('index', 'index'));

        $errors = array();

        $action = $this->getRequest()->getQuery('action');

        if ($this->getRequest()->isPost())
            $action = 'submit';

        switch ($action) {
            case 'submit':
                $login = trim($this->getRequest()->getPost('login'));
                if (strlen($login) == 0) {
                    $errors['login'] = 'Поле должно быть заполнено';
                } else {
                    $user = new DatabaseObject_User($this->db);
                    if ($user->load($login, 'login')) {
                        $user->fetchPassword();
                        $url = $this->getUrl('fetchpassword') . '?action=complete';
                        
                        $message = sprintf('Запрос нового пароля пользователем  %s',
                               $user->login);

                        $this->writeLog($message);
                        
                        $this->_redirect($url);
                    }
                    else
                        $errors['login'] = 'Пользователь с указанным логином не найден.';
                }
                break;

            case 'complete':
                break;
        }

        $this->view->errors = $errors;
        $this->view->action = $action;
    }

    public function editprofileAction() {
        $auth = Zend_Auth::getInstance();
        $cats = DatabaseObject_Categories::GetCategories($this->db);

        $fp = new FormProcessor_EditProfile($this->db, $auth->getIdentity()->id);

        if ($this->getRequest()->isPost()) {
            if ($fp->process($this->getRequest())) {
                $auth->getStorage()->write($fp->user->createAuthIdentity());
                
                $message = sprintf('Изменение личных данных пользователем  %s',
                               $user->login);

                $this->writeLog($message);
                
                $this->_redirect($this->getUrl('editprofilecomplete'));
            }
        }
        if ($this->getRequest()->getParam('region')) { $region_id = $this->getRequest()->getParam('region');$this->view->cities = DatabaseObject_Cities::GetCities($this->db, $region_id);}
        $this->view->regions = DatabaseObject_Region::GetRegion($this->db);
     
        $this->view->cats = $cats;
        $this->view->fp = $fp;
        $this->view->usermenu= 'editprofile';
    }

    public function editprofilecompleteAction() {
        $user = new DatabaseObject_User($this->db);
        $user->load(Zend_Auth::getInstance()->getIdentity()->id);

        $this->view->user = $user;
        $this->view->usermenu= 'editprofile';
    }

    public function myrequestsAction() {
        if ($this->getRequest()->isPost()) {

            $filter_cat = $this->getRequest()->getPost('cats_filter');
            $filter_project = $this->getRequest()->getPost('projects_filter');
            $filter_archive = $this->getRequest()->getPost('archive_filter');
        }
        $requests = DatabaseObject_Requests::FilterRequests($this->db, array('idCat' => $filter_cat, 'idProject' => $filter_project, 'idUser' => array(Zend_Auth::getInstance()->getIdentity()->id), 'isApproved' => $filter_archive));
        // $requests = DatabaseObject_Requests::FilterRequests($this->db, array('where' => 'isDeleted = 0'));
        $cats = DatabaseObject_Categories::GetCategories($this->db);
        $project = DatabaseObject_Project::GetProjects($this->db);
        $user = DatabaseObject_User::GetUsers($this->db);
        $this->view->cats_filter = $filter_cat;
        $this->view->projects_filter = $filter_project;
        $this->view->users_filter = $filter_user;
        $this->view->archive_filter = $filter_archive;
        $this->view->cats = $cats;
        $this->view->users = $user;
        $this->view->projects = $project;
        $this->view->requests = $requests;
        $this->view->usermenu= 'myrequests';
    }

    public function viewrequestAction() {
        $id = $this->getRequest()->getParam('id');

        $request = new DatabaseObject_Requests($this->db);
        $request->load($id);
        if($request->idUser != Zend_Auth::getInstance()->getIdentity()->id)
            $this->_redirect ($this->getUrl('myrequests'));
        
        $request->files = DatabaseObject_RequestFiles::GetRequestsFiles($this->db, $id);
        $this->view->request = $request;
        $this->view->usermenu= 'myrequests';
    }

    public function requesteditAction() {
        $id = $this->getRequest()->getParam('id');
        $request = new DatabaseObject_Requests($this->db);
        $request->load($id);
        if($request->idUser != Zend_Auth::getInstance()->getIdentity()->id)
            $this->_redirect ($this->getUrl('myrequests'));
        
        
        
        $fp = new FormProcessor_RequestEdit($this->db, $id);

        if ($this->getRequest()->isPost()) {
            if ($fp->process($this->getRequest())) {
                // отправим уведомление админам о новой заявке
                $emails = $this->configuration['admin_email'];
                $subject = $this->configuration['admin_email_request_subject'];
                
                $view_request_link = '<a href="http://' . $_SERVER['SERVER_NAME'] . '/admin/requests/' . $fp->request->getId() . '">Просмотеть заявку</a>';
                
                $text = preg_replace("/%viewlink%/", $view_request_link, $this->configuration['admin_email_request_text']);
                
                mail($emails, $subject, $text);
                
                $message = sprintf('Пользователь %s отредактировал отклоненную заявку на участие в тендере "%s"',
                               $request->user->login, $request->tender->name);

                $this->writeLog($message);
                
                $this->_redirect($this->getCustomUrl(array(), 'editrequestcomplete'));
            }
        }

        $this->view->cats = DatabaseObject_Categories::GetCategories($this->db);
        $this->view->projects = DatabaseObject_Project::GetProjects($this->db);
        $this->view->fp = $fp;
        $this->view->usermenu= 'myrequests';
    }

    public function editrequestcompleteAction() {
        // ничего не делаем, просто отображаем шаблон
    }
}

?>
